exception Requete_en_cours
exception Pas_de_requete
(* Levée si on spécifie un traitement à effectuer à la réponse *)
type reponse =
  | Accepte
  | Refuse
  | Erreur
type 'carte joueur
val est_connecte: 'carte joueur -> bool
val string_of_joueur: 'carte joueur -> string
val joueurs_disponibles: 'carte joueur -> string list
val mes_adversaires: 'carte joueur -> string array
val en_jeu: 'carte joueur -> bool 
(* La phase d'enchères compte comme une phase de jeu *)
val mon_numero: 'carte joueur -> int option 
(*numéro de tour*)
val enchere_de: 'carte joueur -> int -> int option 
(* 0 : passe, 4 : garde sans *)
val preneur: 'carte joueur -> int option
val carte_appelee: 'carte joueur -> 'carte option
val ecart_connu: 'carte joueur -> 'carte list option 
(*Si le jeu a commencé, soit c'est une liste vide (je ne connais pas *)
(*l'écart), soit il y a 1 ou 2 ou 3 atouts dévoilés, soit il y a les 3 *)
(*cartes de l'écart, car j'ai pris. *)
val requete_en_cours: 'carte joueur -> bool
(* Un bon moyen d'éviter les exceptions, c'est de vérifier s'il n'y a *)
(* pas déjà une requête en cours. *)
val doit_priser: 'carte joueur -> bool
val enchere_maximale: 'carte joueur -> (int * int)
(* Premier int : le preneur temporaire, deuxième int : l'enchère *)
(* (passe = 0, garde = 2, rien fait = -1)*)
val doit_appeler: 'carte joueur -> bool
val doit_ecarter: 'carte joueur -> bool
val make: unit -> 'carte joueur
val traiter_reponse: 'carte joueur -> (reponse -> unit) -> unit
(* Ajoute ce traitement après les autres, lors de la réception de la *)
(* réponse. Si aucune requête n'est en cours, lève Pas_de_requete *)
val assimiler_requete_deconnecter: 'carte joueur -> unit
(* Déconnecte le joueur, en spécifiant Erreur comme valeur de la *)
(* réponse si une requête est en cours. *)
val assimiler_requete_identifier: 'carte joueur -> string -> unit
val assimiler_requete_inviter: 'carte joueur -> string list -> unit
val assimiler_requete_prise: 'carte joueur -> int -> unit
val assimiler_requete_appel: 'carte joueur -> 'carte -> unit
val assimiler_requete_ecart: 'carte joueur -> 'carte list -> unit
val assimiler_information_erreur: 'carte joueur -> unit
(* La requête a été refusée par le serveur. *)
val assimiler_information_connexion: 'carte joueur -> unit
(* Je suis connecté *)
val assimiler_information_deconnexion: 'carte joueur -> unit
(* En cas de requête en cours, la réponse est false. *)
val assimiler_information_entree: 'carte joueur -> string -> unit
val assimiler_information_sortie: 'carte joueur -> string -> unit
val assimiler_information_noms: 'carte joueur -> string array -> unit
val assimiler_information_numero: 'carte joueur -> int -> unit
val assimiler_information_contrat: 'carte joueur -> int -> unit
val assimiler_information_appel: 'carte joueur -> unit 
(* Je dois appeler ! *)
val assimiler_information_contrat_final: ('carte -> string) -> 
					 'carte joueur -> int -> int
					 -> 'carte -> unit
(* 1er argument : string_of_carte pour un dump en cas d'erreur du *)
(* serveur, 2ème argument : le joueur, 3ème : le preneur selon le *)
(* serveur, 4ème : la prise selon le serveur, 5ème : la carte appelée *)
(* selon le serveur. *)
val assimiler_information_atout_au_chien: 'carte joueur -> 'carte list
					  -> unit
val assimiler_information_jeu: 'carte joueur -> unit
(* Le jeu commence ! *)

val repondre_aux: 'carte joueur -> reponse -> unit
